/**
 * @file XXTEA_MCU.h
 * @brief XXTEA加密算法头文件（适合单片机）
 * @version V1.2
 * @date 2025-08-22
 * @details 该头文件定义了XXTEA加密算法在单片机环境下的接口和常量
 */

#ifndef XXTEA_MCU_H
#define XXTEA_MCU_H

#include <stdint.h>
#include <stddef.h> ///< 为size_t提供支持

/**
 * @def MAX_INPUT_LEN
 * @brief 最大输入数据长度（字节）
 * @note 为减少内存占用，设置为200字节
 */
#define MAX_INPUT_LEN 200

/**
 * @def MAX_HEX_LEN  
 * @brief 最大HEX字符串长度
 * @note 为输入长度的2倍，考虑终止符
 */
#define MAX_HEX_LEN 400

/**
 * @def MAX_V_LEN
 * @brief 最大长整型数组长度
 * @note 计算公式：MAX_INPUT_LEN/4 + 1
 */
#define MAX_V_LEN 51

/**
 * @def DELTA
 * @brief XXTEA算法常量
 * @note 源自黄金分割比例：0x9E3779B9 = 2654435769
 */
#define DELTA 0x9E3779B9

// 测试函数声明
/**
 * @brief HEX解密测试函数
 * @return 无
 */
void test_decrypt(void);

/**
 * @brief 二进制解密测试函数  
 * @return 无
 */
void test_binary_decrypt(void);

/**
 * @brief 串口二进制数据解密接口函数
 * @param[out] uart0data 输出解密结果缓冲区
 * @param[in] key 解密密钥字符串
 * @param[in] ciphertext_bin 输入二进制密文数据指针
 * @param[in] ciphertext_len 密文数据长度
 * @return 成功返回0，失败返回-1
 */
int Uart0data_decrypt_binary(char *uart0data, const char *key, const uint8_t *ciphertext_bin, size_t ciphertext_len);

/**
 * @brief 主解密接口函数
 * @param[out] uart0data 输出解密结果缓冲区
 * @param[in] key 解密密钥字符串
 * @param[in] ciphertext_hex 输入HEX格式密文字符串
 * @param[in] ciphertext_len 密文字符串长度
 * @return 成功返回0，失败返回-1
 */
int Uart0data_decrypt(char *uart0data, const char *key, const char *ciphertext_hex, size_t ciphertext_len);

// 核心算法函数声明
/**
 * @brief XXTEA加密核心算法
 * @param[in] data 输入明文数据指针
 * @param[in] data_len 输入数据长度
 * @param[in] key 加密密钥字符串
 * @param[out] result 输出密文数据指针
 * @param[out] result_len 输出密文长度
 * @return 无
 */
void xxtea_encrypt(const uint8_t *data, size_t data_len, const char *key, uint8_t *result, size_t *result_len);

/**
 * @brief XXTEA解密核心算法
 * @param[in] data 输入密文数据指针
 * @param[in] data_len 输入数据长度
 * @param[in] key 解密密钥字符串
 * @param[out] result 输出明文数据指针
 * @param[out] result_len 输出明文长度
 * @return 无
 */
void xxtea_decrypt(const uint8_t *data, size_t data_len, const char *key, uint8_t *result, size_t *result_len);

// 实用功能函数声明
/**
 * @brief 主加密函数
 * @param[in] input 输入明文字符串
 * @param[in] key 加密密钥字符串
 * @param[out] hex_out 输出HEX格式密文字符串
 * @return 无
 */
void encrypt_message(const char *input, const char *key, char *hex_out);

/**
 * @brief HEX解密函数封装
 * @param[in] hex_ciphertext HEX格式密文字符串
 * @param[in] hex_len HEX字符串长度
 * @param[in] key 解密密钥字符串
 * @param[out] decrypted_output 输出解密结果字符串
 * @return 无
 */
void decrypt_hex_ciphertext(const char *hex_ciphertext, size_t hex_len, const char *key, char *decrypted_output);

/**
 * @brief 二进制数据解密函数
 * @param[in] ciphertext 输入密文数据指针
 * @param[in] ciphertext_len 密文数据长度
 * @param[in] key 解密密钥字符串
 * @param[out] decrypted_output 输出解密结果字符串
 * @return 无
 */
void decrypt_binary(const uint8_t *ciphertext, size_t ciphertext_len, const char *key, char *decrypted_output);

/**
 * @brief 将字节数据转换为HEX字符串格式
 * @param[in] input 输入字节数据指针
 * @param[in] length 输入数据长度
 * @param[out] hex 输出HEX字符串指针
 * @return 无
 */
void toHex(const uint8_t *input, size_t length, char *hex);

#endif /* XXTEA_MCU_H */